import java.io.*;
import java.util.*;

import javax.swing.JOptionPane;

public class Control
{
	private 
	   BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	   boolean prof_registrado = false;
	   Seccion sec;
	      
	public Control()
	{
		super();
	    this.sec = new Seccion();
	}
	//*************************************** PROCESAR SECCION   ********************************************
	public void ProcesarSeccion()
	{
		int opt = 0;
		boolean seg;
		System.out.print("Ingrese el numero de la seccion : ");
		try
		{
		   String num_sec = in.readLine();
		   this.sec.setNum_secc(num_sec);
		}catch(IOException e){}
		
		do
		{
			do
			{
				System.out.println("\nRegistro Academico\n");
				System.out.print("(1)Incluir Profesor."
				+ "\n(2)Inscribir Estudiantes."
				+ "\n(3)Mostar Profesor."
				+ "\n(4)Aplicar Evaluacion."
				+ "\n(5)Retirar Estudiante."
				+ "\n(6)Buscar Estudiante."
				+ "\n(7)Promedio de notas."
				+ "\n(8)Listado de Estudiantes."
				+ "\n(9)Listado de Estudiantes Aprobados."
				+ "\n(10)Listado de Estudiantes Aplazados."
				+ "\n(0)Salir."
				+"\nOpcion :");
				seg = false;
				try
				{
					opt = Integer.parseInt(in.readLine());
					if(opt < 0 || opt > 10)
					{
						System.out.println("Opcion invalida!");
						seg = true;
					}
				}
				catch(Exception e)
				{
					System.out.println("Opcion invalida!");
					seg = true;
				}
			}while(seg);
			limpiar();
			switch(opt)
			{
			    case 1: 
			    	IncluirProfesor();
			    	break;
			    case 2:
			    	InscribirEstudiante();
			    	break;
			    case 3:
			    	Mostar_Profesor();
			    	break;
			    case 4:
			    	AplicarEvaluacion();
			    	break;
			    case 5:
			    	RetirarEstudiante();
			    	break;
			    case 6:
			    	BuscarEstudiante();
			    	break;
			    case 7:
			    	MostrarPromedio();
			        break;
			    case 8:
			    	ListarEstudiante();
			    	break;
			    case 9:
			    	ListarEstudiantesAprob();
			    	break;
			    case 10:
			    	ListarEstudiantesAplazados();
			    	break;
			}
		}while(opt != 0);
		
	}
	
	public void limpiar() 
	{
		for (int i=0; i<15;i++)
		System.out.println();
	}
	
	public void MostrarPromedio()
	{
		if(this.sec.NumeroEstudiante() == 0)
			System.out.println("No existen estudiantes registrados!");
		else
			System.out.println("Promedio de la seccion : " + this.sec.Promedio());
	
	}
	
	public void AplicarEvaluacion()
	{
		if(!prof_registrado) 
			System.out.println("Debe registrar un Profesor!");
		else if(this.sec.NumeroEstudiante() == 0)
			System.out.println("No existen estudiantes registrados!");
		else
		{
	    	this.sec.AplicarEvaluaciones();
	    	this.sec.EvaluarEstuduantes();
	    	System.out.println("La evaluacion fue realizada con exito!");
		}
	}
	
	public void BuscarEstudiante()
	{
		if(this.sec.NumeroEstudiante() == 0)
			System.out.println("No existen estudiantes registrados!");
		else
		{
			System.out.println("Ingrese la cedula : ");
			try
			{
			   int i = this.sec.Buscar((long)Integer.parseInt(in.readLine()));
			   if(i == -1)
				   JOptionPane.showMessageDialog(null,"El estudiante no existe!", "Advertencia", JOptionPane.WARNING_MESSAGE);
			   else
			   {
				   System.out.println("Cedula : " + this.sec.getEstudiante(i).getCedula());
				   System.out.println("Nombre : " + this.sec.getEstudiante(i).getNombre());
				   System.out.println("Apellido : " + this.sec.getEstudiante(i).getApellido()); 
			   }
			}
			catch(Exception e)
			{
				System.out.println("Se produjo un ERROR!.");
			}
		}
	}
	
	public void RetirarEstudiante()
	{
		if(this.sec.NumeroEstudiante() == 0)
			System.out.println("No existen estudiantes registrados!");
		else
		{
			System.out.println("Ingrese la cedula : ");
			try
			{
			   int i = this.sec.Buscar((long)Integer.parseInt(in.readLine()));
			   if(i == -1)
				   System.out.println("El estudiante  no existe!");
			   else
			   {
				   this.sec.RetirarEstudiante(i);
				   System.out.println("Estudiante eliminado correctamente!");
			   }
			}
			catch(Exception e)
			{
				System.out.println("Se produjo un ERROR!.");
			}
		}
	}
	
	public void ListarEstudiantesAprob()
	{
		boolean imp = true;
		if(this.sec.NumeroEstudiante() == 0)
		{
			System.out.println("No existen estudiantes registrados!");
		    Imprimir_en_TXT("Estudiantes Aprobados.txt","No existen estudiantes Aprobados!",true);
		}
		else
		{
			System.out.println("Estudiantes Aprobados :");
			Imprimir_en_TXT("Estudiantes Aprobados.txt","Estudiantes Aprobados :",true);
			Vector<Estudiante> Est = sec.getEstudiantes();
			for(int i = 0;i < Est.size();i++)
				if(Est.elementAt(i).getEstado())
				{
				   System.out.println(Est.elementAt(i).getCedula() + "  " + Est.elementAt(i).getApellido() 
						   			+ "  " + Est.elementAt(i).getNombre() + "  " + Est.elementAt(i).getNota_final());
				   Imprimir_en_TXT("Estudiantes Aprobados.txt",Est.elementAt(i).getCedula() + "  " + Est.elementAt(i).getApellido() 
						   			+ "  " + Est.elementAt(i).getNombre() + "  " + Est.elementAt(i).getNota_final(),false);
				   imp = false;
				}
		   if(imp)System.out.println("No existen estudiantes Aprobados!");
		}
	}
	
	public void ListarEstudiantesAplazados()
	{
		boolean imp = true;
		if(this.sec.NumeroEstudiante() == 0)
		{
			System.out.println("No existen estudiantes registrados!");
			Imprimir_en_TXT("Estudiantes Aplazados.txt","No existen estudiantes registrados!",true);
		}
		else
		{
			System.out.println("Estudiantes Aplazados :");
			Imprimir_en_TXT("Estudiantes Aplazados.txt","Estudiantes Aplazados :",true);
			Vector<Estudiante> Est = sec.getEstudiantes();
			for(int i = 0;i < Est.size();i++)
				if(!Est.elementAt(i).getEstado())
				{
					System.out.println(Est.elementAt(i).getCedula() + "  " + Est.elementAt(i).getApellido() 
				   			+ "  " + Est.elementAt(i).getNombre() + "  " + Est.elementAt(i).getNota_final());
		            Imprimir_en_TXT("Estudiantes Aplazados.txt",Est.elementAt(i).getCedula() + "  " + Est.elementAt(i).getApellido() 
				   			+ "  " + Est.elementAt(i).getNombre() + "  " + Est.elementAt(i).getNota_final(),false);
				    imp = false;
				}
		   if(imp)System.out.println("No existen estudiantes Aplazados!");
		}
	}
	
	public void ListarEstudiante()
	{
		if(this.sec.NumeroEstudiante() == 0)
			System.out.println("No existen estudiantes registrados!");
		else
		{
			String str = "";
			int x;
			boolean seg;
			do
			{
				seg = false;
				System.out.println("Estudiantes ordenados por :"
				+ "\n(1)Cedula"
				+ "\n(2)Notas"
				+ "\nOpcion :");
				try
				{
				    x = Integer.parseInt(in.readLine());
				    if(x <= 0)
					{
						System.out.println("Debe ingresar un numero valido!");
						seg = true;
					}
				    else if(x == 1)
				    {
				    	sec.OrdenarEstudianteCed();
				    	str = "Cedula:";
				    }
				    else
				    {
				    	sec.OrdenarEstudianteNota();
				        str = "Notas:";
				    }
				}
				catch(Exception e)
				{
					System.out.println("Debe ingresar un numero valido!");
					seg = true;
				}
			}while(seg);
			System.out.println("Estudiantes Inscritos ordenados por " + str + " :");
			Imprimir_en_TXT("Estudiantes ordenados por " + str + ".txt","Estudiantes Inscritos ordenados por " + str + " :",true);
			Vector<Estudiante> Est = sec.getEstudiantes();
			for(int i = 0;i < Est.size();i++)
			{
				System.out.println(Est.elementAt(i).getCedula() + "  " + Est.elementAt(i).getApellido() 
			   			+ "  " + Est.elementAt(i).getNombre() + "  " + Est.elementAt(i).getNota_final());
			    Imprimir_en_TXT("Estudiantes ordenados por " + str + ".txt",Est.elementAt(i).getCedula() + "  " + Est.elementAt(i).getApellido() 
			    		+ "  " + Est.elementAt(i).getNombre() + "  " + Est.elementAt(i).getNota_final(),false);
			}
		}
	}
	
	public void InscribirEstudiante()
	{
	    int n = 0;
		String c = "",nomb = "",a = "";
		boolean seg;
		do
		{
			System.out.print("Ingrese el numero de estudiantes a inscribir :");
			seg = false;
			try
			{
				n = Integer.parseInt(in.readLine());
				if(n <= 0)
				{
					System.out.println("Debe ingresar un numero valido!");
					seg = true;
				}
			}
			catch(Exception e)
			{
				System.out.println("Debe ingresar un numero valido!");
				seg = true;
			}
		}while(seg);
		while(n-- > 0)
		{
			System.out.println("Ingrese los datos del Estudiante:");
			try
			{
				System.out.print("Cedula : ");c = in.readLine();
				
				if(this.sec.Buscar((long)Integer.parseInt(c)) == -1)
				{
					System.out.print("Nombre : ");nomb = in.readLine();
					System.out.print("Apellido : ");a = in.readLine();
					Estudiante e = new Estudiante((long)Integer.parseInt(c),nomb,a);
				    this.sec.InscribirEstudiantes(e);
				}
				else
				{
					System.out.println("Ya existe un estudiante con cedula " + c);
					n++;
				}
			}
			catch(Exception e)
			{
				System.out.println("Se produjo un ERROR en la lectura de los datos.");
				n++;
			}
		}
	}
	
	public void IncluirProfesor()
	{
		if(prof_registrado)
		{
			System.out.println("El profesor ya fue registrado!");
		}
		else
		{
			String c,n,a,t;
			System.out.println("Ingrese los datos del profesor:");
			try
			{
			   System.out.print("Cedula : ");c = in.readLine();
			   System.out.print("Nombre : ");n = in.readLine();
			   System.out.print("Apellido : ");a = in.readLine();
			   System.out.print("Titulo Academico : ");t = in.readLine();
			   this.sec.setProf((long)Integer.parseInt(c),n,a,t);
			   prof_registrado = true;
			}
			catch(Exception e)
			{
				System.out.println("Se produjo un ERROR en la lectura de los datos.");
			}
		}
	}
	
	public void Mostar_Profesor()
	{
		if(!prof_registrado) 
			System.out.println("Debe registrar un Profesor!");
		else 
			System.out.println("Prof. " + this.sec.getProf().getApellido() + ' ' 
			+ this.sec.getProf().getNombre() + ", " + this.sec.getProf().getTitulo_acam());
	}
	
	public void Imprimir_en_TXT(String archivo,String texto,boolean nuevo)
	{
		try
		{
			FileWriter fw = new FileWriter(archivo,!nuevo);
			BufferedWriter bw = new BufferedWriter(fw);
			PrintWriter out = new PrintWriter(bw);
			out.println(texto);
			out.close();
		}catch(Exception e)
		{
			System.out.println("No se pudo imprimir en el archivo + \"" + archivo + "\"");
		}
	}
}